# === MODÉLISATION PRÉDICTIVE DES ATTAQUES TERRORISTES ===
# Chargement des bibliothèques nécessaires
library(tidyverse) # Pour la manipulation des données
## Warning: le package 'tidyverse' a été compilé avec la version R 4.4.2
## Warning: le package 'ggplot2' a été compilé avec la version R 4.4.2
## Warning: le package 'forcats' a été compilé avec la version R 4.4.1
## Warning: le package 'lubridate' a été compilé avec la version R 4.4.1
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.5
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ ggplot2 3.5.1 ✔ tibble 3.2.1
## ✔ lubridate 1.9.3 ✔ tidyr 1.3.1
## ✔ purrr 1.0.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(caret) # Pour la division des données et les métriques
## Le chargement a nécessité le package : lattice
##
## Attachement du package : 'caret'
##
## L'objet suivant est masqué depuis 'package:purrr':
##
## lift
library(randomForest) # Pour le modèle Random Forest
## Warning: le package 'randomForest' a été compilé avec la version R 4.4.2
## randomForest 4.7-1.2
## Type rfNews() to see new features/changes/bug fixes.
##
## Attachement du package : 'randomForest'
##
## L'objet suivant est masqué depuis 'package:dplyr':
##
## combine
##
## L'objet suivant est masqué depuis 'package:ggplot2':
##
## margin
library(xgboost) # Pour le modèle XGBoost
## Warning: le package 'xgboost' a été compilé avec la version R 4.4.2
##
## Attachement du package : 'xgboost'
##
## L'objet suivant est masqué depuis 'package:dplyr':
##
## slice
library(ROCR) # Pour les courbes ROC
## Warning: le package 'ROCR' a été compilé avec la version R 4.4.2
library(nnet) # Pour le modèle Neural Network
## Warning: le package 'nnet' a été compilé avec la version R 4.4.2
library(plotly) # Pour les graphiques interactifs
## Warning: le package 'plotly' a été compilé avec la version R 4.4.2
##
## Attachement du package : 'plotly'
##
## L'objet suivant est masqué depuis 'package:xgboost':
##
## slice
##
## L'objet suivant est masqué depuis 'package:ggplot2':
##
## last_plot
##
## L'objet suivant est masqué depuis 'package:stats':
##
## filter
##
## L'objet suivant est masqué depuis 'package:graphics':
##
## layout
library(viridis) # Pour les palettes de couleurs
## Warning: le package 'viridis' a été compilé avec la version R 4.4.2
## Le chargement a nécessité le package : viridisLite
library(readr) # Pour la lecture des fichiers CSV
# === 1. CHARGEMENT DES DONNÉES ===
cat("\n=== CHARGEMENT DES DONNÉES ===\n")
##
## === CHARGEMENT DES DONNÉES ===
# Lecture du fichier CSV avec read_csv
gtd_data <- read_csv("C:/Users/digor/OneDrive/Documents/Projet_SCI1402_analyse_GTD/data/processed/gtd_clean.csv",
show_col_types = FALSE)
cat("Données chargées avec succès !\n")
## Données chargées avec succès !
# Aperçu des premières lignes
head(gtd_data)
## # A tibble: 6 × 145
## eventid iyear imonth iday approxdate extended resolution country country_txt
## <dbl> <dbl> <dbl> <dbl> <chr> <dbl> <chr> <chr> <chr>
## 1 1.97e11 1970 7 2 Unknown 0 Unknown Unknown Dominican …
## 2 1.97e11 1970 0 0 Unknown 0 Unknown Unknown Mexico
## 3 1.97e11 1970 1 0 Unknown 0 Unknown Unknown Philippines
## 4 1.97e11 1970 1 0 Unknown 0 Unknown Unknown Greece
## 5 1.97e11 1970 1 0 Unknown 0 Unknown Unknown Japan
## 6 1.97e11 1970 1 1 Unknown 0 Unknown Unknown United Sta…
## # ℹ 136 more variables: region <chr>, region_txt <chr>, provstate <chr>,
## # city <chr>, latitude <dbl>, longitude <dbl>, specificity <dbl>,
## # vicinity <dbl>, location <chr>, summary <chr>, crit1 <dbl>, crit2 <dbl>,
## # crit3 <dbl>, doubtterr <dbl>, alternative <dbl>, alternative_txt <chr>,
## # multiple <dbl>, success <lgl>, suicide <dbl>, attacktype1 <dbl>,
## # attacktype1_txt <chr>, attacktype2 <dbl>, attacktype2_txt <chr>,
## # attacktype3 <dbl>, attacktype3_txt <chr>, targtype1 <dbl>, …
# === 2. PRÉPARATION DES DONNÉES ===
cat("\n=== PRÉPARATION DES DONNÉES ===\n")
##
## === PRÉPARATION DES DONNÉES ===
# Sélectionner la cible (success) et les variables prédictives importantes
# "success" est la variable cible binaire (1 = succès, 0 = échec)
data <- gtd_data %>%
select(success, iyear, region, attacktype1, targtype1, natlty1) %>%
drop_na() # Retirer les lignes avec des valeurs manquantes
# Vérifier les niveaux des facteurs et supprimer les variables avec un seul niveau
data <- data %>% mutate(across(where(is.character), as.factor))
data <- data %>% select_if(~!is.factor(.) || nlevels(.) > 1)
# Assurer que la variable 'success' est binaire
data$success <- as.factor(ifelse(data$success == TRUE, 1, 0))
# Diviser les données en train (70%) et test (30%)
set.seed(123) # Pour la reproductibilité
train_index <- createDataPartition(data$success, p = 0.7, list = FALSE)
train_data <- data[train_index, ]
test_data <- data[-train_index, ]
# === 3. ENTRAÎNEMENT DES MODÈLES ===
cat("\n=== ENTRAÎNEMENT DES MODÈLES ===\n")
##
## === ENTRAÎNEMENT DES MODÈLES ===
# 3.1 Régression Logistique
cat("\n--- Modèle : Régression Logistique ---\n")
##
## --- Modèle : Régression Logistique ---
logistic_model <- glm(success ~ ., data = train_data, family = binomial)
logistic_pred <- predict(logistic_model, test_data, type = "response")
logistic_pred_class <- ifelse(logistic_pred > 0.5, 1, 0)
# 3.2 Random Forest
cat("\n--- Modèle : Random Forest ---\n")
##
## --- Modèle : Random Forest ---
rf_model <- randomForest(success ~ ., data = train_data, ntree = 100)
rf_pred <- predict(rf_model, test_data, type = "class")
# 3.3 XGBoost
cat("\n--- Modèle : XGBoost ---\n")
##
## --- Modèle : XGBoost ---
# Conversion en format matriciel pour XGBoost
train_matrix <- xgb.DMatrix(data = as.matrix(train_data %>% select(-success)), label = as.numeric(train_data$success) - 1)
test_matrix <- xgb.DMatrix(data = as.matrix(test_data %>% select(-success)))
xgb_model <- xgboost(data = train_matrix, max.depth = 3, eta = 0.1, nrounds = 100, objective = "binary:logistic")
## [1] train-logloss:0.629645
## [2] train-logloss:0.577801
## [3] train-logloss:0.534920
## [4] train-logloss:0.499110
## [5] train-logloss:0.468993
## [6] train-logloss:0.443518
## [7] train-logloss:0.421892
## [8] train-logloss:0.403453
## [9] train-logloss:0.387713
## [10] train-logloss:0.374222
## [11] train-logloss:0.362628
## [12] train-logloss:0.352695
## [13] train-logloss:0.344193
## [14] train-logloss:0.336912
## [15] train-logloss:0.330466
## [16] train-logloss:0.324759
## [17] train-logloss:0.320092
## [18] train-logloss:0.315834
## [19] train-logloss:0.312282
## [20] train-logloss:0.309210
## [21] train-logloss:0.306420
## [22] train-logloss:0.304089
## [23] train-logloss:0.302002
## [24] train-logloss:0.300261
## [25] train-logloss:0.298726
## [26] train-logloss:0.297384
## [27] train-logloss:0.296085
## [28] train-logloss:0.295059
## [29] train-logloss:0.294135
## [30] train-logloss:0.293350
## [31] train-logloss:0.292245
## [32] train-logloss:0.291580
## [33] train-logloss:0.290824
## [34] train-logloss:0.290272
## [35] train-logloss:0.289655
## [36] train-logloss:0.288998
## [37] train-logloss:0.288386
## [38] train-logloss:0.287969
## [39] train-logloss:0.287533
## [40] train-logloss:0.287197
## [41] train-logloss:0.286832
## [42] train-logloss:0.286363
## [43] train-logloss:0.286085
## [44] train-logloss:0.285660
## [45] train-logloss:0.285314
## [46] train-logloss:0.285065
## [47] train-logloss:0.284750
## [48] train-logloss:0.284341
## [49] train-logloss:0.284146
## [50] train-logloss:0.283867
## [51] train-logloss:0.283495
## [52] train-logloss:0.283220
## [53] train-logloss:0.283073
## [54] train-logloss:0.282913
## [55] train-logloss:0.282688
## [56] train-logloss:0.282388
## [57] train-logloss:0.282172
## [58] train-logloss:0.281912
## [59] train-logloss:0.281691
## [60] train-logloss:0.281383
## [61] train-logloss:0.281278
## [62] train-logloss:0.281151
## [63] train-logloss:0.280979
## [64] train-logloss:0.280774
## [65] train-logloss:0.280582
## [66] train-logloss:0.280411
## [67] train-logloss:0.280325
## [68] train-logloss:0.279956
## [69] train-logloss:0.279672
## [70] train-logloss:0.279527
## [71] train-logloss:0.279351
## [72] train-logloss:0.279249
## [73] train-logloss:0.279084
## [74] train-logloss:0.278918
## [75] train-logloss:0.278775
## [76] train-logloss:0.278511
## [77] train-logloss:0.278360
## [78] train-logloss:0.278219
## [79] train-logloss:0.278094
## [80] train-logloss:0.277884
## [81] train-logloss:0.277662
## [82] train-logloss:0.277464
## [83] train-logloss:0.277266
## [84] train-logloss:0.277148
## [85] train-logloss:0.277063
## [86] train-logloss:0.276943
## [87] train-logloss:0.276854
## [88] train-logloss:0.276749
## [89] train-logloss:0.276601
## [90] train-logloss:0.276408
## [91] train-logloss:0.276162
## [92] train-logloss:0.275832
## [93] train-logloss:0.275667
## [94] train-logloss:0.275573
## [95] train-logloss:0.275508
## [96] train-logloss:0.275351
## [97] train-logloss:0.275204
## [98] train-logloss:0.275028
## [99] train-logloss:0.274956
## [100] train-logloss:0.274862
xgb_pred <- predict(xgb_model, test_matrix)
xgb_pred_class <- ifelse(xgb_pred > 0.5, 1, 0)
# 3.4 Neural Network
cat("\n--- Modèle : Neural Network ---\n")
##
## --- Modèle : Neural Network ---
nn_model <- nnet(success ~ ., data = train_data, size = 5, trace = FALSE)
nn_pred <- predict(nn_model, test_data, type = "raw")
nn_pred_class <- ifelse(nn_pred > 0.5, 1, 0)
# === 4. CALCUL DES MÉTRIQUES ===
cat("\n=== CALCUL DES MÉTRIQUES ===\n")
##
## === CALCUL DES MÉTRIQUES ===
# Fonction pour calculer les métriques (Accuracy, Precision, Recall, F1)
calculate_metrics <- function(actual, predicted) {
confusion <- confusionMatrix(as.factor(predicted), as.factor(actual))
list(
Accuracy = round(confusion$overall['Accuracy'], 3),
Precision = round(confusion$byClass['Pos Pred Value'], 3),
Recall = round(confusion$byClass['Sensitivity'], 3),
F1 = round(2 * (confusion$byClass['Pos Pred Value'] * confusion$byClass['Sensitivity']) /
(confusion$byClass['Pos Pred Value'] + confusion$byClass['Sensitivity']), 3)
)
}
# Calculer les métriques pour chaque modèle
metrics <- list(
Logistic_Regression = calculate_metrics(test_data$success, logistic_pred_class),
Random_Forest = calculate_metrics(test_data$success, rf_pred),
XGBoost = calculate_metrics(test_data$success, xgb_pred_class),
Neural_Network = calculate_metrics(test_data$success, nn_pred_class)
)
## Warning in confusionMatrix.default(as.factor(predicted), as.factor(actual)):
## Levels are not in the same order for reference and data. Refactoring data to
## match.
## Warning in confusionMatrix.default(as.factor(predicted), as.factor(actual)):
## Levels are not in the same order for reference and data. Refactoring data to
## match.
print(metrics)
## $Logistic_Regression
## $Logistic_Regression$Accuracy
## Accuracy
## 0.89
##
## $Logistic_Regression$Precision
## Pos Pred Value
## NaN
##
## $Logistic_Regression$Recall
## Sensitivity
## 0
##
## $Logistic_Regression$F1
## Pos Pred Value
## NaN
##
##
## $Random_Forest
## $Random_Forest$Accuracy
## Accuracy
## 0.904
##
## $Random_Forest$Precision
## Pos Pred Value
## 0.651
##
## $Random_Forest$Recall
## Sensitivity
## 0.28
##
## $Random_Forest$F1
## Pos Pred Value
## 0.391
##
##
## $XGBoost
## $XGBoost$Accuracy
## Accuracy
## 0.902
##
## $XGBoost$Precision
## Pos Pred Value
## 0.714
##
## $XGBoost$Recall
## Sensitivity
## 0.188
##
## $XGBoost$F1
## Pos Pred Value
## 0.298
##
##
## $Neural_Network
## $Neural_Network$Accuracy
## Accuracy
## 0.89
##
## $Neural_Network$Precision
## Pos Pred Value
## NaN
##
## $Neural_Network$Recall
## Sensitivity
## 0
##
## $Neural_Network$F1
## Pos Pred Value
## NaN
# === 5. VISUALISATION DES RÉSULTATS ===
cat("\n=== VISUALISATION DES RÉSULTATS ===\n")
##
## === VISUALISATION DES RÉSULTATS ===
# Afficher les métriques dans un graphique interactif
metrics_df <- do.call(rbind, metrics) %>%
as.data.frame() %>%
rownames_to_column("Modèle")
plot_ly(metrics_df, x = ~Modèle, y = ~Accuracy, type = 'bar', name = 'Accuracy') %>%
add_trace(y = ~Precision, name = 'Precision') %>%
add_trace(y = ~Recall, name = 'Recall') %>%
add_trace(y = ~F1, name = 'F1') %>%
layout(title = "Performance des modèles",
barmode = 'group',
xaxis = list(title = "Modèles"),
yaxis = list(title = "Score"))
# === FIN DU SCRIPT ===
cat("\n=== MODÉLISATION TERMINÉE ===\n")
##
## === MODÉLISATION TERMINÉE ===